package org.stock.agent.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.stereotype.Service;
import org.stock.agent.model.AnalysisResult;
import org.stock.agent.tools.StockTools;


@Service
@Slf4j
public class FundamentalAnalyst {

    private final ChatClient openAiChatClient;
    private final ChatModel chatModel;
    private final StockTools stockTools;

    public FundamentalAnalyst(ChatModel chatModel, StockTools stockTools) {

        this.chatModel = chatModel;
        this.stockTools = stockTools;

        // 构造时，可以设置 ChatClient 的参数
        // {@link org.springframework.ai.chat.client.ChatClient};
        this.openAiChatClient = ChatClient.builder(chatModel)
                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时，需要指定对话 ID，以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build()
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        OpenAiChatOptions.builder()
                                .topP(0.7)
                                .build()
                )
                .build();
    }

    public AnalysisResult analyzeFundamental(String symbol) {
        String prompt = """
            作为价值投资基本面分析师，请从长期价值投资的角度全面深入分析{symbol}公司的基本面状况，重点关注其是否具备长期持有价值。
            
            你需要使用以下工具获取相关信息进行分析：
            1. 使用getStockBasicInfo获取股票基础信息，包括公司名称、行业等
            2. 使用getBalanceSheet获取最近3年的资产负债表数据，分析公司资产结构、负债水平和股东权益变化
            3. 使用getIncomeStatement获取最近3年的利润表数据，分析营收增长、盈利能力、成本控制情况
            4. 使用getCashFlowStatement获取最近3年的现金流量表数据，分析经营、投资、筹资活动现金流状况
            5. 使用getFinancialMainIndex获取最新的财务主要指标，包括但不限于：
               - 盈利能力指标（ROE、ROA、毛利率、净利率等）
               - 偿债能力指标（资产负债率、流动比率、速动比率等）
               - 运营能力指标（存货周转率、应收账款周转率等）
               - 成长能力指标（营收增长率、净利润增长率等）
            6. 使用getCompanyCapital获取公司股本信息，了解股本结构变化
            7. 使用getTopShareholders获取公司十大股东信息，分析股权结构稳定性
            8. 使用getTopCirculatingShareholders获取公司十大流通股东信息，了解流通股集中度
            9. 使用getShareholderNumbers获取公司股东数信息，分析股东数量变化趋势
            10. 使用getLatestTransaction获取最近30条交易数据，了解市场对公司基本面的反应
            11. 使用getRecentDividends获取近年分红数据，分析公司分红政策和股东回报情况
            12. 使用getRecentOfferings获取近年增发数据，了解公司融资和扩张情况
            13. 使用getQuarterlyProfit获取近一年各季度利润数据，分析盈利的季节性变化和趋势
            14. 使用getQuarterlyCashFlow获取近一年各季度现金流数据，分析现金流的季节性变化和趋势
            15. 使用getPerformanceForecast获取近年业绩预告数据，了解公司未来业绩预期
            16. 使用getFinancialIndicators获取财务指标数据，进行全面的财务分析
            
            请从以下几个维度进行深入分析：
            1. 公司业务和行业地位分析：
               - 主营业务及竞争力，寻找具有护城河的公司
               - 行业地位和市场份额，重点关注行业龙头或细分领域龙头
               - 商业模式可持续性，评估是否具备长期竞争优势
               - 公司治理结构，管理层能力及诚信度评估
            
            2. 财务健康状况分析：
               - 资产负债结构合理性，寻找负债率适中、资产质量高的公司
               - 偿债能力评估，确保公司财务风险可控
               - 现金流状况分析（特别是经营性现金流），稳定的经营现金流是价值投资的重要指标
               - 财务数据真实性分析，避免财务造假公司
            
            3. 盈利能力分析：
               - 营收和利润增长趋势，寻找稳定增长的公司
               - 毛利率、净利率变化趋势，评估盈利能力的稳定性
               - ROE、ROA等回报率指标分析，高ROE且稳定的公司更具投资价值
               - 盈利质量分析，评估利润的现金含量
            
            4. 成长性分析：
               - 营收、净利润增长情况，寻找可持续增长的公司
               - 市场份额扩展能力
               - 新业务拓展情况，评估未来成长潜力
               - 行业发展空间，评估公司成长的天花板
            
            5. 估值水平分析：
               - 与同行业公司对比，寻找相对低估的公司
               - 历史估值水平对比，识别历史低估区域
               - 当前价格是否反映真实价值，重点关注被低估的优质公司
            
            6. 股权结构分析：
               - 股东结构稳定性，稳定的股权结构有利于公司长期发展
               - 机构投资者持仓情况，专业机构投资者的认可度
               - 流通股集中度分析，适度集中的流通股有利于股价稳定
               - 大股东增减持情况分析
            
            7. 风险因素识别：
               - 财务风险点，评估潜在的财务风险
               - 经营风险因素，分析公司经营中的潜在问题
               - 行业和政策风险，评估外部环境对公司的影响
               - 管理层风险，评估管理层变动对公司的影响
            
            8. 价值投资关键指标分析：
               - 自由现金流状况，持续正向自由现金流是价值投资的核心指标
               - 股息政策及稳定性，稳定的股息政策体现公司财务稳健
               - 资产质量分析，评估公司真实资产价值
               - 负债结构分析，避免高风险负债结构
            
            结合以上分析，评估公司是否具有长期价值投资潜力，
            并判断该股票是否具备长期持有的基本面条件，
            给出适合作为长期价值投资标的的可能性百分比（0-100）和详细的理由分析。
            
            特别注意：
            - 如果发现财务数据异常或不一致，请在分析中指出
            - 对比分析最近3年的财务数据变化趋势
            - 结合行业特点和宏观经济环境进行分析
            - 考虑季节性因素对财务数据的影响
            - 重点关注财务稳健、盈利能力强、估值合理的公司
            
            请严格按照以下JSON格式返回结果：
            {
              "analystRole": "价值投资基本面分析师",
              "symbol": "{symbol}",
              "probability": [0-100之间的数值，表示适合作为长期价值投资标的的概率],
              "reasoning": "[详细的基本面分析理由，至少包含500字，涵盖上述分析维度，特别说明该股票是否适合长期价值投资]",
              "confidenceLevel": "[高/中/低，基于数据质量和分析确定性]"
            }
            """;

        AnalysisResult entity = openAiChatClient.prompt(prompt + "symbol是" + symbol)
                //.user(userSpec -> userSpec.text(prompt).param("symbol", symbol))
                .tools(stockTools)
                .call()
                .entity(AnalysisResult.class);
        log.info("价值投资基本面分析师: {}", entity.getReasoning());
        return entity;
    }
}